#!/bin/bash

# ✅ 参数校验：必须输入模块名、profile、server_id
if [ $# -lt 3 ]; then
  echo "❗用法: $0 <module-name> <profile> <server-id>"
  echo "例子:  ./deploy.sh dctp-market prod server1"
  exit 1
fi

# 1️⃣ 基础配置
BASE_DIR="/Users/lichengming/Documents/program/server/java/dctp"   # <-- 修改为你本地的项目根目录
MODULE_NAME=$1
PROFILE=$2
SERVER_ID=$3    # server1 / server2 / server3
ZIP_NAME="${MODULE_NAME}-release.zip"
UNZIP_DIR="${MODULE_NAME}"
REMOTE_PATH="/data/project/${MODULE_NAME}"
REMOTE_USER="root"
SSH_KEY_PATH="$HOME/.ssh/key-dctp-prod.pem"


# 2️⃣ 服务器映射表（可随时扩展）
get_server_ip() {
  case "$1" in
    server1) echo "103.135.250.17" ;;
    server2) echo "103.135.251.45" ;;
    *) echo "" ;;
  esac
}

SERVER_ID=$3
REMOTE_HOST=$(get_server_ip "$SERVER_ID")


if [ -z "$REMOTE_HOST" ]; then
  echo "❌ 未找到 SERVER_ID: $SERVER_ID 对应的服务器 IP"
  exit 1
fi

export JAVA_HOME="/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home"

# ====================
# Step 1: 编译 dctp-common 模块
# ====================
function build_common() {
  echo "🔧 正在安装 dctp-common 模块..."
  cd "$BASE_DIR/dctp-common" || exit 1
  mvn clean install -P${PROFILE}
  if [ $? -ne 0 ]; then
    echo "❌ dctp-common 安装失败"
    exit 1
  fi
}

# ====================
# Step 2: 打包当前模块
# ====================
function build_module() {
  echo "📦 正在打包模块 ${MODULE_NAME}..."
  cd "$BASE_DIR/$MODULE_NAME" || exit 1
  mvn clean package
  if [ $? -ne 0 ]; then
    echo "❌ 模块 ${MODULE_NAME} 打包失败"
    exit 1
  fi
}

# ====================
# Step 3: 上传 ZIP 包
# ====================
# 上传 ZIP 包
function upload_zip() {
  local zip_path="target/${ZIP_NAME}"
  if [ ! -f "$zip_path" ]; then
    echo "❌ 文件不存在: $zip_path"
    exit 1
  fi
  echo "🚀 正在上传 ${ZIP_NAME} 到 ${SERVER_ID}(${REMOTE_HOST})..."
  rsync -avz -e "ssh -i ${SSH_KEY_PATH} -o StrictHostKeyChecking=no" --progress "$zip_path" ${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_PATH}/
}

# ====================
# Step 4: 远程部署并启动
# ====================
function remote_deploy() {
  echo "🔄 正在远程部署到 ${SERVER_ID} (${REMOTE_HOST})..."
  ssh -i "${SSH_KEY_PATH}" -o StrictHostKeyChecking=no "${REMOTE_USER}@${REMOTE_HOST}" "
 set -e

 cd '${REMOTE_PATH}'

 # 备份旧目录
 if [ -d '${UNZIP_DIR}' ]; then
   mkdir -p bak
   BAK_NAME=\"\$(basename '${UNZIP_DIR}')_bak_\$(date +%Y%m%d%H%M%S)\"
   echo '📁 备份旧目录 ${UNZIP_DIR} -> bak/'\$BAK_NAME
   mv '${UNZIP_DIR}' \"bak/\$BAK_NAME\"
 fi

 # 解压新包
 unzip -q -o '${ZIP_NAME}' -d .

 cd '${MODULE_NAME}'
 chmod +x jfinal.sh

 # 特殊处理: 释放 9000 端口（只针对 dctp-market）
 if [ '${MODULE_NAME}' = 'dctp-push' ]; then
   PORT=9000
   PID=\$(lsof -t -i:\$PORT 2>/dev/null || true)
   if [ -n \"\$PID\" ]; then
     echo '⚠️ 检测到 9000 端口被占用 (PID: '\$PID')，尝试 kill'
     kill -9 \$PID || true
     sleep 2
   fi
 fi


 # 特殊处理: 释放 9001 端口（只针对 dctp-scheduler）
  if [ '${MODULE_NAME}' = 'dctp-scheduler' ]; then
    PORT=9001
    PID=\$(lsof -t -i:\$PORT 2>/dev/null || true)
    if [ -n \"\$PID\" ]; then
      echo '⚠️ 检测到 9001 端口被占用 (PID: '\$PID')，尝试 kill'
      kill -9 \$PID || true
      sleep 2
    fi
  fi

 # 强制 stop/start，传入 SERVER_ID
 ./jfinal.sh stop || true
 sleep 2
 echo '🟢 启动服务 (server_id=${SERVER_ID})...'
 > output.log
 ./jfinal.sh start '${SERVER_ID}'

 max_wait=60
 waited=0
 success_keyword=\"Welcome To The JFinal World\"

 while [ \$waited -lt \$max_wait ]; do
   if grep -q \"\$success_keyword\" output.log; then
     echo \"✅ 服务启动成功！\"
     break
   fi
   sleep 2
   waited=\$((waited + 2))
 done

 if [ \$waited -ge \$max_wait ]; then
   echo \"❌ 启动超时，未检测到服务启动成功关键字：\$success_keyword\"
   exit 1
 fi
 "
}

# === 主流程 ===
cd "$BASE_DIR" || exit 1
build_common
build_module
upload_zip
remote_deploy

echo "✅ 模块 ${MODULE_NAME} 已部署到 ${SERVER_ID} (${REMOTE_HOST})"
